package podologia;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.util.Calendar;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import podologia.beansDB.Diaatencion;
import podologia.beansDB.Turno;

/**
 *
 * @author Mauricio
 */
public class Calendario extends JPanel {

    private int ancho;
    private int alto;
    private Graphics grap;
    private List<Turno> Turnos;
    private List<Diaatencion> DiasAtencion;
    private int diaAncho = ancho / 7;
    private int horaAlto = alto / 60;
    private Color fondo = new Color(244, 244, 244);

    public Calendario() {
        ancho = 700;
        alto = 480;
        setBorder(BorderFactory.createLineBorder(Color.black));
        setBackground(fondo);
        diaAncho = ancho / 7;
        horaAlto = alto / 60;


    }

    public Calendario(int ancho, int alto, List Turnos, List DiasAtencion) {
        this.ancho = ancho;
        this.alto = alto;
        this.Turnos = Turnos;
        this.DiasAtencion = DiasAtencion;
        diaAncho = ancho / 7;
        horaAlto = alto / 60;
    }

    public Calendario(int ancho, int alto) {
        this.ancho = ancho;
        this.alto = alto;
        setBorder(BorderFactory.createLineBorder(Color.black));

        setBackground(fondo);
        diaAncho = ancho / 7;
        horaAlto = alto / 60;
    }

    public int getAlto() {
        return alto;
    }

    public void setAlto(int alto) {
        this.alto = alto;
    }

    public int getAncho() {
        return ancho;
    }

    public void setAncho(int ancho) {
        this.ancho = ancho;
    }

    public Graphics getGrap() {
        return grap;
    }

    public void setGrap(Graphics grap) {
        this.grap = grap;
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(ancho, alto);
    }

    @Override
    public void paintComponent(Graphics g) {
        grap = g;
        super.paintComponent(g);
        if (DiasAtencion != null) {
            dibujarHorarioAtencion();
        }
        dibujarLineas();
        if (Turnos != null) {
            dibujarTurnos();
        }
    }

    void cargarData(List<Turno> turnos, List<Diaatencion> diaatencion) {
        this.Turnos = turnos;
        this.DiasAtencion = diaatencion;
    }

    private void dibujarLineas() {
        int dia = ancho / 7;
        int hora = alto / 60;
        Color Azul = new Color(57, 125, 148);
        Color Celeste = new Color(170, 195, 226);


        grap.setColor(Azul);

        //Divido en los 7 Dias
        for (int i = 0; i < 7; i++) {
            grap.drawLine(dia * i, 0, dia * i, alto);
        }

        //Divide en horarios en 15 verticales
        for (int i = 0; i < 60; i++) {
            if (i % 4 == 0) {
                grap.setColor(Azul);
                grap.drawLine(0, hora * i, ancho, hora * i);
            } else {
                grap.setColor(Celeste);
                drawDashedLine(grap, 0, hora * i, ancho, hora * i, 6, 10);
            }
        }

    }

    private void dibujarHorarioAtencion() {

        Color Libre = new Color(61  , 158, 255);
        grap.setColor(Libre);
        int X = 0;
        int Y = 0;
        int Ancho = 0;
        int Alto = 0;

        //Recorro los dias de atencion del profesional
        for (Diaatencion dia : DiasAtencion) {
            //Dibujo rectangulo
            Y = (int) (((dia.getHoraInicio() / 1000 / 60 / 60 )-7) * (horaAlto * 4));
            X = (dia.getDia() == 1) ? (dia.getDia() + 5) * diaAncho : (dia.getDia() - 2) * diaAncho;
            Ancho = diaAncho;
            Alto = (int) ((dia.getHoraFin() - dia.getHoraInicio()) / (1000 * 60 * 60)) * (horaAlto * 4);
            grap.fillRect(X, Y, Ancho, Alto);
        }

    }

    private void dibujarTurnos() {
        Calendar calen = Calendar.getInstance();
        int X = 0;
        int Y = 0;
        int Ancho = 0;
        int Alto = 0;
        Color Turno = new Color(181, 199, 239);
        Font letra = new Font("Thaoma", Font.BOLD, 10);
        String nombre = null;

        for (Turno turno : Turnos) {
            calen.setTimeInMillis(turno.getHora());
            //Caculo cordenadas y tamanio (Domingo = 1 y graficamente el primero es lunes)
            X = (calen.get(Calendar.DAY_OF_WEEK) == 1) ? (calen.get(Calendar.DAY_OF_WEEK) + 5) * diaAncho : (calen.get(Calendar.DAY_OF_WEEK) - 2) * diaAncho;
            //Calculo la posicion de donde empezar a dibujar - horaAlto = cantidad de pixel de 15 minutos
            Y = ((calen.get(Calendar.HOUR_OF_DAY) - 7)*(horaAlto * 4)) + ((calen.get(Calendar.MINUTE) / 15)*horaAlto);
            Ancho = diaAncho;
            Alto =(int) (( (float) turno.getDuracion() / (1000 * 60 * 60)) * (horaAlto * 4));

            //Pinto el fondo gris
            grap.setColor(Color.GRAY);
            grap.fillRoundRect(X + 3, Y + 3, Ancho - 3, Alto - 3, 3, 3);

            //Pinto el turno
            grap.setColor(Turno);
            grap.fillRoundRect(X + 1, Y + 1, Ancho - 4, Alto - 4, 3, 3);

            //Dibujo el nombre
            if (Alto > 12) {
                nombre = turno.getIdPaciente().getIdPersona().getApellido();
                nombre = (nombre.length() > 12) ? nombre.substring(0, 12).concat("...") : nombre;
                grap.setColor(Color.BLACK);
                grap.setFont(letra);
                grap.drawString(nombre, X + 2, Y + 12);
            }
        }


    }

    /*
     * Repinta el calendario con los dias de atencion y los turnos.
     * @param Turnos Lista que continene los turnos del profesional seleccionado en una semana determinada.
     * @param DiasAt Lista con los dia que atiende el profesional seleccionado.
     */
    public void pintarBardo(List Turnos, List DiasAt) {
        this.DiasAtencion = DiasAt;
        this.Turnos = Turnos;
        //paintComponent(grap);
        dibujarHorarioAtencion();
        dibujarLineas();
        dibujarTurnos();
    //paintComponent(grap);
    }

    //Pintar lineas de puntos -- nose que hace la tome prestada
    private void drawDashedLine(Graphics g, int x1, int y1, int x2, int y2, double dashlength, double spacelength) {
        if ((x1 == x2) && (y1 == y2)) {
            g.drawLine(x1, y1, x2, y2);
            return;
        }
        double linelength = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
        double yincrement = (y2 - y1) / (linelength / (dashlength + spacelength));
        double xincdashspace = (x2 - x1) / (linelength / (dashlength + spacelength));
        double yincdashspace = (y2 - y1) / (linelength / (dashlength + spacelength));
        double xincdash = (x2 - x1) / (linelength / (dashlength));
        double yincdash = (y2 - y1) / (linelength / (dashlength));
        int counter = 0;
        for (double i = 0; i < linelength - dashlength; i += dashlength + spacelength) {
            g.drawLine((int) (x1 + xincdashspace * counter), (int) (y1 + yincdashspace * counter), (int) (x1 + xincdashspace * counter + xincdash), (int) (y1 + yincdashspace * counter + yincdash));
            counter++;
        }
        if ((dashlength + spacelength) * counter <= linelength) {
            g.drawLine((int) (x1 + xincdashspace * counter), (int) (y1 + yincdashspace * counter), x2, y2);
        }
    }
}
